package AsignacionDeRevisores;
import callForPapers.*;
import sistema.*;

import java.util.ArrayList;
import java.util.List;


public class AsignacionPorAlta extends AsignacionDeRevisores {
	// Variables de instancia:
	private List<Usuario> lRevisores = new ArrayList<Usuario>();
	private Usuario auxiliar;
	private int salida = 1; 
	public List<Usuario> ordenarRevisoresPorFechaDeAlta(List<Usuario> revisores){ 
		
		lRevisores = revisores;
	// Si la lista tiene 2 o más elementos:	
	if ((lRevisores.size()) > 1){
		int anteUltimo = lRevisores.size() - 2; // índice del anteúltimo elemento.
		do{
			// Cada vez que hago un loop completo a la colección inicializo el índice.
			int i = 0; 
			// y la salida.
			this.salida = 1; 
			for (@SuppressWarnings("unused") Usuario revisorActual: lRevisores){ // Este for controla que de una vuelta al Array.
				if(lRevisores.get(i).getFecha().after(lRevisores.get(i + 1).getFecha())){
					// si el revisor actual es posterior al siguiente.
				// ##########################################################################
					salida = 0; // NO SALE SIGUE LABURANDO.
				// ##########################################################################
					// SWAP!!! Imperativo FTW!!!
					auxiliar = lRevisores.get(i); // asigno el revisor actual a la variable auxiliar
					// meto el segundo revisor en el lugar del revisor anterior:
					lRevisores.set(i,lRevisores.get(i + 1));
					// meto el auxiliar(revisor) en el lugar del revisor siguiente:
					lRevisores.set(i+1,auxiliar);
					if (i == anteUltimo){ i = 0;} // Evito hacer el siguiente del último elemento
					else{i++;} // Si no llegue al anteúltimo, hago siguiente.
				}
			}
			// Si luego de recorrer completamente lRevisores, "salida" no cambio, significa que la 
			// lista está ordenada y sale del while.
			if (salida == 1){ return lRevisores;}
		}while(salida == 0); // mientras falten cosas para ordenar, loopear otra vez!
	}
	return lRevisores; // Si la lista es vacía, devuelve una lista vacía.
	}
	public void asignarRevisores(CallForPaper cfp){
		// Convierto los set en List:
		List<Usuario> listaRevisores = this.ordenarRevisoresPorFechaDeAlta(this.obtenerListaDeRevisores(cfp));
		List<Paper> papers = (List<Paper>) this.obtenerListaDePapers(cfp);
		// Uso el método de la superclase:
		super.asignarPapersARevisores(listaRevisores,papers);
	}

}
